﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace YY.Admin.Core
{
    public interface ISysCacheService
    {
        /// <summary>
        /// 申请分布式锁
        /// </summary>
        IDisposable? BeginCacheLock(string key, int msTimeout = 500, int msExpire = 10000, bool throwOnFailure = true);

        /// <summary>
        /// 获取缓存键名集合
        /// </summary>
        List<string> GetKeyList();

        /// <summary>
        /// 增加缓存
        /// </summary>
        bool Set(string key, object value);

        /// <summary>
        /// 增加缓存并设置过期时间
        /// </summary>
        bool Set(string key, object value, TimeSpan expire);

        /// <summary>
        /// 异步获取或添加缓存（无参数）
        /// </summary>
        Task<TR> AdGetAsync<TR>(string cacheName, Func<Task<TR>> del, TimeSpan? expiry = default) where TR : class;

        /// <summary>
        /// 异步获取或添加缓存（1个参数）
        /// </summary>
        Task<TR> AdGetAsync<TR, T1>(string cacheName, Func<T1, Task<TR>> del, T1 t1, TimeSpan? expiry = default) where TR : class;

        /// <summary>
        /// 异步获取或添加缓存（2个参数）
        /// </summary>
        Task<TR> AdGetAsync<TR, T1, T2>(string cacheName, Func<T1, T2, Task<TR>> del, T1 t1, T2 t2, TimeSpan? expiry = default) where TR : class;

        /// <summary>
        /// 异步获取或添加缓存（3个参数）
        /// </summary>
        Task<TR> AdGetAsync<TR, T1, T2, T3>(string cacheName, Func<T1, T2, T3, Task<TR>> del, T1 t1, T2 t2, T3 t3, TimeSpan? expiry = default) where TR : class;

        /// <summary>
        /// 获取缓存（1个参数）
        /// </summary>
        T Get<T>(string cacheName, object t1);

        /// <summary>
        /// 获取缓存（2个参数）
        /// </summary>
        T Get<T>(string cacheName, object t1, object t2);

        /// <summary>
        /// 获取缓存（3个参数）
        /// </summary>
        T Get<T>(string cacheName, object t1, object t2, object t3);

        /// <summary>
        /// 获取缓存的剩余生存时间
        /// </summary>
        TimeSpan GetExpire(string key);

        /// <summary>
        /// 获取缓存
        /// </summary>
        T Get<T>(string key);

        /// <summary>
        /// 删除缓存
        /// </summary>
        int Remove(string key);

        /// <summary>
        /// 清空所有缓存
        /// </summary>
        void Clear();

        /// <summary>
        /// 检查缓存是否存在
        /// </summary>
        bool ExistKey(string key);

        /// <summary>
        /// 根据键名前缀删除缓存
        /// </summary>
        int RemoveByPrefixKey(string prefixKey);

        /// <summary>
        /// 根据键名前缀获取键名集合
        /// </summary>
        List<string> GetKeysByPrefixKey(string prefixKey);

        /// <summary>
        /// 获取缓存值（原始对象）
        /// </summary>
        object GetValue(string key);

        /// <summary>
        /// 获取或添加缓存（在数据不存在时执行委托请求数据）
        /// </summary>
        T GetOrAdd<T>(string key, Func<string, T> callback, int expire = -1);

        /// <summary>
        /// 获取Hash缓存字典
        /// </summary>
        IDictionary<string, T> GetHashMap<T>(string key);

        /// <summary>
        /// 批量添加Hash值
        /// </summary>
        bool HashSet<T>(string key, Dictionary<string, T> dic);

        /// <summary>
        /// 添加一条Hash值
        /// </summary>
        void HashAdd<T>(string key, string hashKey, T value);

        /// <summary>
        /// 添加或更新一条Hash值
        /// </summary>
        void HashAddOrUpdate<T>(string key, string hashKey, T value);

        /// <summary>
        /// 获取多条Hash值
        /// </summary>
        List<T> HashGet<T>(string key, params string[] fields);

        /// <summary>
        /// 获取一条Hash值
        /// </summary>
        T HashGetOne<T>(string key, string field);

        /// <summary>
        /// 根据KEY获取所有Hash值
        /// </summary>
        IDictionary<string, T> HashGetAll<T>(string key);

        /// <summary>
        /// 删除Hash值
        /// </summary>
        int HashDel<T>(string key, params string[] fields);
    }
}
